package database

import (
	"context"
	"fmt"
	"jianianhua-server/config"
	"jianianhua-server/models"
	"log"

	"github.com/go-redis/redis/v8"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var DB *gorm.DB
var RedisClient *redis.Client

// InitDB 初始化数据库连接
func InitDB(cfg *config.Config) {
	// 使用MySQL数据库
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		cfg.DBUsername, cfg.DBPassword, cfg.DBHost, cfg.DBPort, cfg.DBName)

	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
		DisableForeignKeyConstraintWhenMigrating: true,
		DisableAutomaticPing: true,
	})

	if err != nil {
		log.Printf("数据库连接失败: %v", err)
		return
	}

	// 禁用 GORM 自动迁移，手动管理数据库表
	// 所有表结构都通过 SQL 脚本手动创建和维护

	log.Println("数据库连接成功")
}

// InitRedis 初始化Redis连接
func InitRedis(cfg *config.Config) {
	RedisClient = redis.NewClient(&redis.Options{
		Addr:     cfg.RedisHost + ":" + cfg.RedisPort,
		Password: cfg.RedisPassword,
		DB:       cfg.RedisDB,
	})

	// 测试连接
	ctx := context.Background()
	_, err := RedisClient.Ping(ctx).Result()
	if err != nil {
		log.Printf("Redis连接失败: %v", err)
		return
	}

	log.Println("Redis连接成功")
}

// CheckAndCreateTables 检查并创建表结构
func CheckAndCreateTables() {
	if DB == nil {
		log.Println("数据库未初始化，跳过表结构检查")
		return
	}

	log.Println("开始检查数据库表结构...")

	// 检查并创建表
	checkAndCreateTable(&models.User{})
	checkAndCreateTable(&models.Product{})
	checkAndCreateTable(&models.AppointmentConfig{})
	checkAndCreateTable(&models.Appointment{})
	checkAndCreateTable(&models.Banner{})
	checkAndCreateTable(&models.UserSettings{})

	log.Println("数据库表结构检查完成")
}

func checkAndCreateTable(model interface{}) {
	// 检查表是否存在
	if !DB.Migrator().HasTable(model) {
		log.Printf("创建表: %T", model)
		err := DB.Migrator().CreateTable(model)
		if err != nil {
			log.Printf("创建表失败: %v", err)
		} else {
			log.Printf("表创建成功")
		}
	} else {
		log.Printf("表已存在")
	}
}
